home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 1 / CD_Magazyn_EXEC_nr_1.iso / eXec / Analiza i kompresja mowy / Vocoder.m < prev   
Text File  |  2000-01-11  |  6KB  |  220 lines

  1. function []=vocoder( plik_in, plik_vo, plik_out );
  2. % Koder LPC, Kwant 1999
  3. %
  4. % Sposób u¿ycia:
  5. %     lpccodec('próbka_wejœciowa_mowa.wav', 'próbka_wejœciowa_pobudzenie', 'próbka_wyjœciowa.wav');
  6. %
  7. % Vocoder.m
  8.  
  9.  
  10. % ====================  koder  =====================      
  11.  
  12. % czytanie pliku  wejœciowego
  13.     [x]= wavread( plik_in );
  14.     Fs= 8000;
  15.     xv= wavread( plik_vo );
  16.  
  17. % obliczanie d³ugoœci pliku
  18.     eof= length(x);
  19.  
  20. % lpc nieprawid³owo dzia³a na zerowych próbkach wiêc niedopuszczam do tego
  21.     for l=1:eof
  22.       if( x(l)==0 )
  23.         x(l)=eps;
  24.         end
  25.     end
  26.  
  27. % Filtrowanie sygnalu wejsciowego filtrem BP 10-900Hz
  28. % ograniczenie pasma dla sygna³u z którego bêdzie obliczany pitch
  29.     Impulse= fir1( 128, [50/(Fs/2) 900/(Fs/2)], 'high' );
  30.     PitchX_orig= filter(Impulse, 1, [x; zeros(128,1)] );
  31.     PitchX= PitchX_orig( 65:eof+64 );
  32.  
  33. % preemfaza uwypuklenie wysokich czêstotliowœci
  34. x(2:eof)=x(2:eof)-0.9375*x(1:eof-1);
  35.  
  36. % potrzebne do autokorelacji
  37.     n=1:240;                              
  38.     index=1;
  39.     maximum=zeros(1,240);
  40.  
  41. %    wstêpne przeliczone wartoœci
  42. %    okno Hamminga
  43.     h= Hamming( 240 );
  44.  
  45. %    g³ówna pêtla encodera
  46.     for l=1:180:eof-240
  47.  
  48.     % 'we' sygna³ bie¿¹cej ramki
  49.       we=x(l:l+239).*h;
  50.     %    wevo= xv( l:l+239 ).*h;
  51.    
  52.     %    kombinacje w celu poprawnego obliczenia wartoœci pitch, clipping
  53.         PitchXnoWin=[PitchX(l:l+239)' zeros(1,240)];  
  54.         Cl=0.7*min( max(PitchXnoWin(1:80)), max(PitchXnoWin(80:240)) );
  55.  
  56.     % clipping sygna³u (aby uwypukliæ czêstotliwoœæ g³ówn¹)
  57.         for k=1:480
  58.         if PitchXnoWin(k)>= Cl
  59.           clipper(k)=PitchXnoWin(k)-Cl;
  60.             elseif PitchXnoWin(k)<=-Cl
  61.                  clipper(k)=PitchXnoWin(k)+Cl;
  62.             else
  63.                 clipper(k)=0;
  64.             end
  65.         end
  66.    
  67.     %    Autokorelacja  
  68.    auto=zeros(1,240);
  69.    for K=0:239
  70.       auto(K+1)=sum( clipper(n).*clipper(n+K) );
  71.    end
  72.    
  73.     %    Maksima autokorelacji
  74.    maximum_1=maximum;     %maksima z poprzedniej iteracji
  75.    maximum(1)=0;
  76.    for K=2:239
  77.       if auto(K-1)<auto(K) & auto(K)>auto(K+1)
  78.          if auto(K)>0
  79.             maximum(K)=auto(K);
  80.          else
  81.             maximum(K)=0;
  82.          end
  83.       elseif auto(K-1)<auto(K) & auto(K)==auto(K+1) %maksimum p³askie
  84.          z=K+1;
  85.          while auto(K)==auto(z) & z<239
  86.             z=z+1;
  87.          end
  88.          
  89.          for y=K:z
  90.             if auto(K)>auto(z)
  91.                maximum(y)=auto(K);
  92.             else
  93.                maximum(y)=0;
  94.             end
  95.          end
  96.          K=z;
  97.       else
  98.          maximum(K)=0;
  99.       end
  100.         end
  101.    
  102.         [max1 imax1]=max(maximum_1);
  103.         [max0 imax0]=max(maximum);
  104.   
  105.     %    Okreœlanie czy g³oska jest dŸwiêczna czy bezdŸwiêczna
  106.     %    Jest to krytyczna faza kodera, od prawid³owej decyzji voiced/unvoiced zale¿y w znacznym stopniu jakoœæ generowanego dŸwiêku 
  107.         if imax1+imax1*0.2>imax0 & imax1-imax1*0.2<imax0
  108.             if max0>0.3*auto(1)
  109.                 Pitch=imax0;
  110.       else
  111.          Pitch=0;
  112.       end
  113.         else
  114.       Pitch=0;
  115.         end
  116.    
  117. %    To samo co wy¿ej tylko w mniej wyrafinowany sposób.
  118. %
  119. %    if max0 > 0.3*auto(1)
  120. %        Pitch= imax0;
  121. %    else
  122. %        Pitch= 0;
  123. %    end
  124.  
  125.     %    LPC wykorzystujê funkcjê LPC z Matlaba
  126.         [A G]=lpc(we,10);
  127.     
  128.     %    Sk³adanie danych wyjœciowych 
  129.         Coeff(index,1:11)=A;        % parametry LPC
  130.         Coeff(index,12)=G;            %    wzmocnienie
  131.         Coeff(index,13)=Pitch;    % Pitch (jeœli Pitch=0 to g³oska jest bezdŸwiêczna), w przeciwnym wypadku pitch jest odleg³oœci¹ pomiêdzy kolejnymi impulsami pobudzenia (w samplach Fs= 8000Hz)
  132.    
  133.     %
  134.         if index>=2 & Coeff(index,13)>0 & Coeff(index-1,13)==0
  135.             Coeff(index-1,13)=imax1;
  136.         end
  137.    
  138.     %    numer kolejnej ramki
  139.         index=index+1
  140.     end
  141.  
  142. %    likwidowanie pojedynczych szumow....
  143. %    Jeœli kolejne trzy ramki s¹: V, UV, V to œrodkow¹ ustaw jako Voiced
  144. %    Jeœli kolejne trzy ramki s¹: UV, V, UV to œrodkow¹ ustaw jako Unvoiced
  145.     for l=1:index-3
  146.         if Coeff(l,13)>0 & Coeff(l+1,13)==0 & Coeff(l+2,13)>0
  147.        Coeff(l+1,13)=round((Coeff(l,13)+Coeff(l+2,13))/2);
  148.     elseif Coeff(l,13)==0 & Coeff(l+1,13)>0 & Coeff(l+2,13)==0
  149.        Coeff(l+1,13)=0;
  150.     end
  151.  end
  152.  
  153. % ================= Koniec Kodera ==================
  154.  
  155.  
  156.  
  157.  
  158. %    Parametrami transferowymi jest tablica (macierz) Coeff(...,...) Opis wy¿ej.
  159. % modyfikuj¹c t¹ tablicê (patrz ni¿ej) mo¿na uzyskaæ ciekawe efekty!
  160.  
  161. % Tylko szept
  162. %    Coeff( :, 13 )= 0;
  163.  
  164. % Wszystko tym samym tonem (œrednim z ca³ej próbki)
  165. %    Coeff( :, 13 )= round( mean( Coeff(:,13) ).*( Coeff(:,13)~=0 ) );
  166.  
  167. %    Wszystko tym samym tonem, tylko ni¿ej
  168. %    Coeff( :, 13 )= round( mean( Coeff(:,13)*4 ).*( Coeff(:,13)~=0 ) );
  169.  
  170. % dwa razy ni¿sza czêstotliwoœæ podstawowa (Pitch = Pitch/2)
  171. %    Coeff( :, 13 )= Coeff( :, 13 ).*2;
  172.  
  173. % dyskretne wartoœci Pitch
  174. %    Coeff( :, 13 )= round( Coeff(:, 13)./16 ).*16;
  175.  
  176. % Wszystkie g³oski tak samo g³oœno
  177. %    Coeff( :, 12 )= mean( Coeff(:, 12) );
  178.  
  179.  
  180.  
  181.  
  182.  
  183. % ===================  Dekoder  ====================
  184.  
  185.     LastPitch=0;
  186.     excit=xv(1:index*180)';
  187.     Coeff(1,:)=Coeff(2,:);           %przepisanie pierwszej wartosci Coeff bo jest nieprawidlowa
  188.  
  189. % g³oœnoœæ:
  190.     sin2=sin((1:360)*pi/360).*sin((1:360)*pi/360);
  191.     for l=1:index-2
  192.       for x=1:180
  193.         excit(l*180+x-90)=excit(l*180+x-90) * (Coeff(l,12)*sin2(x+180)+Coeff(l+1,12)*sin2(x));
  194.         end
  195.     end
  196.  
  197.     excit_orig= excit;
  198.  
  199. %    filtr
  200.     Coeff(:,2:11)=- Coeff(:,2:11);
  201.  
  202.     for l=11:(index-1)*180 
  203.            excit(l)=sum(excit(l:-1:l-10).*Coeff( ceil(l/180) ,1:11));
  204.     end
  205.  
  206.     excit(1:180)=zeros(1,180);
  207.  
  208. %    deemfaza
  209.     excit(2:(index-1)*180)=excit(2:(index-1)*180)+0.9375*excit(1:(index-1)*180-1);
  210.  
  211. % normowanie sygna³u
  212.     excit( length(excit)-180*3: length(excit) )= 0;
  213.     max_output=max(excit);
  214.     min_output=-min(excit);
  215.     out=excit/max([min_output,max_output]);
  216.  
  217. % zapis do pliku
  218.     wavwrite(out,8000,16, plik_out );
  219.  
  220.